package com.example.springcloud.lb.impl;

import com.example.springcloud.lb.LoadBalance;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 自定义的简单的负载均衡的算法：每个微服务轮流承担三个请求，有副作用：这个工程其他的controller会失效报错。
 */
@Component
public class LoadBalanceImpl implements LoadBalance {

    // 初始化两个全局辅助变量
    private int index = -1;
    private int count = 0;

    @Override

    public ServiceInstance getInstance(List<ServiceInstance> serviceInstances) {
        // 每个服务轮流承担的请求数量
        int frequency = 5;

        // 1.得到存活的微服务的数量
        int size = serviceInstances.size();

        if (count < frequency && index != -1) {
            // 2.当计数小于frequency并且不是第一次请求的时候，计数+1
            ++count;
        } else {
            // 3.当下标没溢出时，下标+1,下标溢出，需要重置
            index = index < size - 1 ? index + 1 : 0;
            // 4.计数&重置
            count = count == frequency ? 1 : count + 1;
        }
        // 5.返回由下标确定的微服务
        return serviceInstances.get(index);
    }

}
